package com.cskaoyan.javase.object._5finalize;

import java.util.Scanner;

/**
 * Java当中的finalize方法就是"模仿"析构函数设计的，finalize方法也会在对象销毁时自动被调用，
 * 我们Java程序员只需要把释放资源的代码放在finalize方法中，就可以完成对象销毁的"善后"工作。
 *
 * 理想是很美好的，因为有这个finalize方法后，Java的资源释放代码，
 * 就可以统一地写进一个方法中，还会自动调用，多么方便的一种设计啊。
 * 可惜现实是很骨感的，实际上根本达不成这种目的。
 *
 * 为什么呢?
 * 因为Java的GC的垃圾回收,不具有准确性,而是延时性的,不确定的
 * GC会自主决定是否回收一个对象, 那么在该对象成为垃圾,但没有被GC回收的这段时间里,
 * 对象所占用的额外资源,仍然被占用着
 *
 * 总之,释放对象所占用的额外资源是很重要的事情,但GC是"不靠谱"(不具有准时性)
 * 重要的事情不要交给不靠谱的人去完成
 * 所以Java中的释放对象所占用的额外资源,需要程序员全部手动完成,没有自动释放额外资源的机制.
 *
 *
 * @since 17:09
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        new Student();
        // 通知GC进行垃圾回收
        System.gc();

        // Scanner需要键盘录入,它的对象就需要占用系统输入输出资源
        // 严格来说,使用完毕后,需要手动释放资源
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s = sc.nextLine();
        System.out.println(s);
        // 用完了,需要关闭资源,手动关闭
        sc.close();
        System.out.println(sc.nextLine());
    }
}

class Student {
    @Override
    protected void finalize() throws Throwable {
        System.out.println("模拟释放系统资源~");
    }
}